<?php

use App\Http\Controllers\API\PhotoController;
use App\Http\Controllers\Home\AdminController;
use App\Http\Controllers\Home\IndexController;
use App\Http\Controllers\Home\MemberController;
use App\Http\Controllers\Home\UserController;
use App\Http\Middleware\CheckAge;
use Illuminate\Queue\Middleware\RateLimited;
use Illuminate\Support\Facades\Route;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\View\View;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


//==================================路由玩法开始====================================

Route::get('/', function () {
    return view('welcome');
});

// 普通路由
//Route::get('foo', function () {
//    return 'Hello World';
//});

// 指定到路由器
//Route::get('/user', [UserController::class, 'index']);

// 回调函数处理
//Route::get($uri, $callback);
//Route::post($uri, $callback);
//Route::put($uri, $callback);
//Route::patch($uri, $callback);
//Route::delete($uri, $callback);
//Route::options($uri, $callback);
//Route::get('/user', function (){
//    dd('this is test');
//});

// 设置多个请求方式
//Route::match(['get', 'post'], '/user', function () {
//    //
//});

//Route::any('/user', function () {
//    //
//});


// 重定向
//Route::redirect('/here', '/user');
//Route::redirect('/here', '/user', 301);
//Route::permanentRedirect('/here', '/user');  // 自动返回301状态

// 视图路由
//Route::view('/welcome', 'welcome');
//Route::view('/users', 'user/index');
//Route::view('/users', 'user/index', ['name' => 'Taylor']);


// 路由参数
// 1.必填参数
//Route::get('user/{id}', function ($id) {
//    return 'User '.$id;
//});

//Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//    dump($postId);
//    dump($commentId);
//});

//2.可以选参数
//Route::get('user/{name?}', function ($name = null) {
//    return $name;
//});

//Route::get('user/{name?}', function ($name = 'John') {
//    return $name;
//});


//3.参数匹配 [正则表达式约束]
//Route::get('user/{name}', function ($name) {
//    dump($name);
//})->where('name', '[A-Za-z]+');

//Route::get('user/{id}', function ($id) {
//    //
//})->where('id', '[0-9]+');
//
//Route::get('user/{id}/{name}', function ($id, $name) {
//    //
//})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

//Route::get('user/{id}/{name}', function ($id, $name) {
//    //
//})->whereNumber('id')->whereAlpha('name');
//
//Route::get('user/{name}', function ($name) {
//    //
//})->whereAlphaNumeric('name');
//
//Route::get('user/{id}', function ($id) {
//    //
//})->whereUuid('id');


// 全局约束
//使用 pattern 方法在 RouteServiceProvider 的 boot 方法中定义这些：
//Route::get('user/{id}', function ($id) {
//    //只有在 id 为数字时才执行...
//    var_dump($id);
//});


//编码正斜杠字符#
//Laravel 路由组件允许除 / 之外的所有字符。你必须使用 where 条件正则表达式显式地允许 / 成为占位符的一部分：
//Route::get('search/{search}', function ($search) {
//    return $search;
//})->where('search', '.*');


// 路由命名 [备注：这个命名由路是不能在浏览器中直接使用，要在html里面跳转]
//Route::get('user/profile', function () {
//    //
//})->name('profile');
//Route::get('/test',[IndexController::class,'test'])->name('t1');

// 生成链接...
//$url = route('profile');
//// 生成重定向...
//return redirect()->route('profile');

//Route::get('user/{id}/profile', function ($id) {
//    //
//})->name('profile');
//
//$url = route('profile', ['id' => 1]);


//Route::get('user/{id}/profile', function ($id) {
//    //
//})->name('profile');
//
//$url = route('profile', ['id' => 1, 'photos' => 'yes']);


//路由组[其它骚操作都不实用]
//Route::group(['namespace'=>'Home','prefix'=>'member'],function (){
//    //注册
//    Route::get('register', 'MemberController@showRegisterForm')->name('home.member.showRegisterForm');
//    Route::post('register', 'MemberController@register')->name('home.member.register');
//    //登录
//    Route::get('login', 'MemberController@showLoginForm')->name('home.member.showLoginForm');
//    Route::post('login', 'MemberController@login')->name('home.member.login');
//});



// 每分钟限制访问5次，1分钟后生效
//Route::middleware(['throttle:5,1'])->group(function () {
//    Route::get('/audio', function () {
//        var_dump("audio");
//    });
//
//    Route::get('/video', function () {
//        var_dump("video");
//    });
//});


//Route::group(['prefix'=>'api','middleware'=>'throttle:5,1'],function () {
//
//    Route::get('/user', [UserController::class,'index']);
//    Route::get('/audio', function () {
//        var_dump("audio");
//    });
//
//    Route::get('/video', function () {
//        var_dump("video");
//    });
//});


// 路由中间件
//Route::get('/test/{age}','Home\IndexController@test')->name('test')->middleware('age');

// app/Http/Kernel.php:54 这个位置定义的中间件全部可以使用
//Route::get('admin/profile', function () {
//    //
//})->middleware('auth');

//您还可以将多个中间件分配给路由：
//Route::get('/admin/profile', function () {
//    //
//})->middleware('first', 'second');

//分配中间件时，您还可以传递完全限定的类名：
//Route::get('admin/profile', function () {
//    //
//})->middleware(CheckAge::class);

//将中间件分配给一组路由时，有时可能需要阻止将中间件应用于该组中的单个路由。 您可以使用 withoutMiddleware 方法完成此操作：
//withoutMiddleware 方法只能删除路由中间件，不适用于 全局中间件。
//Route::middleware([CheckAge::class])->group(function () {
//    Route::get('/', function () {
//        //
//    });
//
//    Route::get('admin/profile', function () {
//        //
//    })->withoutMiddleware([CheckAge::class]);
//});

// 中间件组 web:是中间件组名
//Route::get('/', function () {
//    //
//})->middleware('web');
//
//Route::group(['middleware' => ['web']], function () {
//    //
//});
//
//Route::middleware(['web', 'subscribed'])->group(function () {
//    //
//});

// 中间件传参
//Route::get('post/{id}', function ($id) {
//    //
//})->middleware('role:editor');


// ===============================路由玩法结束=====================================






// ===============================控制器玩法开始=====================================
//Route::get('user/{id}', [UserController::class, 'show']);


// 控制器中间件
//Route::get('profile', [UserController::class, 'show'])->middleware('auth');

// 资源路由
//Route::resource('photos', PhotoController::class);

//Route::resources([
//    'photos' => App\Http\Controllers\Home\PhotoController::class,
//    'posts' => App\Http\Controllers\Home\PhotoController::class,
//]);

// 部分资源路由
//Route::resource('photos', PhotoController::class)->only([
//    'index', 'show'
//]);

//Route::resource('photos', PhotoController::class)->except([
//    'create', 'store', 'update', 'destroy'
//]);

// api资源路由
Route::apiResource('member', MemberController::class);

// api资源路由组
//Route::apiResources([
//    'photos' => PhotoController::class,
//    'posts' => PhotoController::class,
//]);

// 命名资源路由
//Route::resource('photos', PhotoController::class)->names([
//    'create' => 'photos.build'
//]);

// 命名资源路由参数
///photos/{admin_user}
//Route::resource('photos', PhotoController::class)->parameters([
//    'create' => 'admin_user'
//]);


//限定范围的资源路由
//Route::resource('users.posts', PhotoController::class)->scoped();

//你可以通过给 scoped 方法传递一个数组来覆盖默认的模型路由键：
//Route::resource('users.posts', PhotoController::class)->scoped([
//    'post' => 'slug',
//]);

// ===============================控制器玩法结束=====================================




// ===============================请求玩法开始=====================================
//依赖注入 & 路由参数
//Route::get('user/{id}', [UserController::class, 'update']);


//Route::post('user', [UserController::class, 'index']);

// ===============================请求玩法结束=====================================




// ===============================响应玩法开始=====================================

// 返回字符串和数组
//Route::get('/', function () {
//    return 'Hello World';
//});

//Route::get('/', function () {
//    return [1, 2, 3];
//});


// 响应头部
//Route::get('home', function () {
//    return response('Hello World', 200)
//        ->header('Content-Type', 'text/plain');


    // 添加响应头
//    $content = "data";
//    $type = "text/html";
//    return response($content)
//        ->header('Content-Type', $type)
//        ->header('X-Header-One', 'Header Value')
//        ->header('X-Header-Two', 'Header Value');

    // 或者，你可以使用 withHeaders 方法来指定要添加到响应的头信息数组：
//    return response($content)
//        ->withHeaders([
//            'Content-Type' => $type,
//            'X-Header-One' => 'Header Value',
//            'X-Header-Two' => 'Header Value',
//        ]);


    //Cookies 响应
//    $content = "data";
//    $type = "text/html";
//    $minutes = 100;
//    return response($content)
//        ->header('Content-Type', $type)
//        ->cookie('name', 'value', $minutes);

//});

// 缓存控制中间件
//    Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () {
//        Route::get('privacy', function () {
//            echo "this is privacy";
//        });
//
//        Route::get('terms', function () {
//            echo "this is terms";
//        });
//    });


// 其它响应类型

//Route::get('home', function () {
// 1.视图响应
//$data['data'] = 'data';
//$type = "text/html";
//return response()
//    ->view('home.index.index', $data, 200)
//    ->header('Content-Type', $type);


  //2.JSON 响应
//    return response()->json([
//        'name' => 'Abigail',
//        'state' => 'CA',
//    ]);


    //如果想要创建 JSONP 响应，可以结合 withCallback 方法使用 json 方法：
//    return response()
//        ->json(['name' => 'Abigail', 'state' => 'CA'])
//        ->withCallback($request->input('callback'));


    // 3.文件下载

//    return response()->download($pathToFile);
//
//    return response()->download($pathToFile, $name, $headers);
//
//    return response()->download($pathToFile)->deleteFileAfterSend();


    //4.流下载
//    return response()->streamDownload(function () {
//        echo GitHub::api('repo')
//            ->contents()
//            ->readme('laravel', 'laravel')['contents'];
//    }, 'laravel-readme.md');


    // 5.响应文件
//    return response()->file($pathToFile);
//    return response()->file($pathToFile, $headers);

//});
// ===============================响应玩法结束=====================================






// ===============================视图玩法开始=====================================
//Route::get('/greeting', function () {
//
//    // 分配变量
////    return view('greeting', ['name' => 'James']);
//
//    // 分配数组
//    $data['name'] = 'zhangsan';
//    $data['age'] = 22;
//    return view('greeting', $data);
//
//    // 判断视图文件存不存在
////    if (\Illuminate\Support\Facades\View::exists('greeting')) {
////        echo "模板是存在的";
////    }
//
//
//});
// ===============================视图玩法结束=====================================




// ===============================生成url玩法开始=====================================
//Route::get('/urldemo',[IndexController::class,'urldemo']);
//
//// 命名路由
//Route::get('/post/{post}', function () {
//    //
//})->name('post.show');
//
//// 签名路由
//Route::get('/unsubscribe/{user}', function (Request $request) {
//    if (! $request->hasValidSignature()) {
//        abort(401);
//    }
//
//    // ...
//})->name('unsubscribe');
//
//Route::get('/index',[IndexController::class,'index']);


// ===============================生成url玩法结束=====================================




// ===============================验证器开始=====================================

//Route::get('admin/create', [AdminController::class, 'create']);
//
//Route::post('admin', [AdminController::class, 'store']);

// ===============================验证器结束=====================================


// ===============================异常开始=====================================
Route::get('home', [IndexController::class, 'index']);


// ===============================异常结束=====================================



